iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
0
自我挑戰組

新手 R 語言學習紀錄系列 第 14

Day 14- R語言 vapply、tapply

  • 分享至 

  • xImage
  •  

Day 14- vapply 及tapply
(前言:內個,我只是個剛接觸程式設計的小萌新,如果內文寫的不對,還請各位大大指教 Orz)
今天雖然是颱風天,但還是要堅持下去ㄛ ˊ vˋ
(啊對了,這邊重新附上新的kirbsaesthetics資料框資料,因為在亂寫程式碼時不小心把昨天的kirbsaesthetics覆蓋掉了 QnQ 圖片可能會糊得像稀飯一樣,還請多多見諒 ˊˋ)
https://ithelp.ithome.com.tw/upload/images/20190930/20120887TEuxSzadBR.png
https://ithelp.ithome.com.tw/upload/images/20190930/201208870nCN8PaLOU.png
https://ithelp.ithome.com.tw/upload/images/20190930/201208877oC4dDwQL9.png

昨天學了apply家族中的lapplysapply 函數,兩者都以列表做輸入,把一個函數重複對每個列表中的元素執行,然後結合並回傳結果,lapply回傳一個列表,而sapply會試圖對lapply的結果進行簡化。

至於今天,我會把重點放在vapplytapply身上。

vapplysapply 很像,兩者的差異僅在於函數的寫法以及兩個函數回傳資料的性質。前面提到,sapply 會自動根據lapply輸出的資料結果進行整理,然後以最佳資料型態呈現。但是sapply的輸出結果往往需要我們回去重複確認,才有辦法確保接下來的程式設定不會出問題。聽起來超級麻煩的,而且不確認的話很容易出錯。因此,再不確定sapply的資料輸出型態時,可以使用vapply來指定。

vapply的函數寫法為:vapply(變數, 函數, 回傳資料性質(回傳資料長度)),可以看到vapply的引數多了一個回傳資料性質,這樣使用者可以透過指定資料的輸出型態,降低誤判的機率。(不小心指定錯資料型態也沒有關係,因為vapply會告訴妳妳是否輸錯資料型態)

就昨天的kirbsaesthetics而言,如果要用sapply來加總每一個欄的數值的話,就是寫sapply(kirbsaesthetics, sum),但是,如果使用vapply,可以有好幾種寫法,以下舉幾個例子:

vapply(kirbsaesthetics, sum, matrix(18)) #第一種寫法
vapply(kirbsaesthetics, sum, vector(mode = "numeric", length = 1))  #第二種寫法
vapply(kirbsaesthetics, sum, numeric(1)) #第三種寫法

以上程式都會輸出同樣的結果:
https://ithelp.ithome.com.tw/upload/images/20190930/20120887hbFIb8Vs1m.png
(同樣的東西可能還有好幾種寫法,但是我目前試出來的就這些)
以上這些都會回傳一樣的結果,但是,透過直接指定輸出資料型態(matrix, 向量或數值)可以確保未來在處理其他牽涉資料型態的程式時不會出錯。

接下來學的是tapply函數,但是在正式介紹tapply函數之前,要先認識一下table函數。
table函數的功能是列出在一個列表裡同一元素出現的次數,寫法為table(列表變數名稱$列表欄位名稱),例如:table(kirbsaesthetics$col.9) ,輸出結果是:
https://ithelp.ithome.com.tw/upload/images/20190930/20120887gK329u7JTH.png
那現在正式進入tapply函數的介紹,
tapply函數寫法是:tapply(列表變數名稱$列表欄位名稱, 列表變數名稱$列表欄位名稱, 函數)tapply函數會先統計第二個指定列表欄位的重複元素,然後根據重複元素值的範圍內進行對應欄位的函數運算(我想不到更好的方式解釋這東西了,誰來救救我的中文 QAQ)。例:tapply(kirbsaesthetics$col.1, kirbsaesthetics$col.9, sum),這個函數會回傳以下結果:
https://ithelp.ithome.com.tw/upload/images/20190930/20120887dS2olz1Gmq.png
可以看到,這個函數把col.9重複的元素(1,2,3,4)都整理起來,然後計算1,2,3,4對應col.1內的總和值,這樣一來,如果要做資料的統計的話很方便。不過,寫函數的同時,也別忘記指定列表欄位的先後順序,才不會輸出錯的資料喔。

明天把剩下的apply家族函數學完吧


上一篇
Day 13- R語言 apply家族函數、apply、lapply、 sapply
下一篇
Day15- R語言 mapply、 rapply、 eapply
系列文
新手 R 語言學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言